package com.tang.client;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;

/**
 * client消息处理
 *
 * @author fulin.tang
 * @version V3.0
 * @since 2022/5/20 14:45
 */
@Slf4j
public class ClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 收到服务端消息
     *
     * @param ctx -
     * @param msg -
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        log.info("{} 接收到消息 {}", LocalDateTime.now(), msg);
    }

    /**
     * 连接上服务端
     *
     * @param ctx -
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        log.info("有一个连接上来咯, ID: {}, ADDRESS: {}", ctx.channel().id(), ctx.channel().localAddress());
    }

    /**
     * 断开与服务器的连接了
     *
     * @param ctx -
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        log.info("有一个连接断开了啊, ID: {}, ADDRESS: {}", ctx.channel().id(), ctx.channel().localAddress());
        // 这里调用重连方法，同时加上重连次数不超过5次的方法????
        new Thread(() -> {
            try {
                log.info("启动一个线程重连该代码！");
                new NettyClient().connect("127.0.0.1", 7397);
                log.info("netty client start done!");
                Thread.sleep(500);
            } catch (InterruptedException e) {
                log.error("netty client start error go reconnect!");
            }
        }).start();
    }

    /**
     * 连接异常了
     *
     * @param ctx   -
     * @param cause -
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("异常信息，断开重连:\r\n{}", cause.getMessage());
        ctx.close();
    }
}
